/**
 * requestAnimationFrame polyfill
 */
import {isServer} from '..';

var prev = Date.now();

/* istanbul ignore next */

function fallback(fn) {
    var curr = Date.now();
    var ms = Math.max(0, 16 - (curr - prev));
    var id = setTimeout(fn, ms);
    prev = curr + ms;
    return id;
}

/* istanbul ignore next */


var root = isServer ? global : window;
/* istanbul ignore next */

var iRaf = root.requestAnimationFrame || fallback;
/* istanbul ignore next */

var iCancel = root.cancelAnimationFrame || root.clearTimeout;

export function raf(fn) {
    return iRaf.call(root, fn);
} // double raf for animation

export function doubleRaf(fn) {
    raf(function () {
        raf(fn);
    });
}

export function cancelRaf(id) {
    iCancel.call(root, id);
}